#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
    //dp[i]=到i位置获取的最大点数 -> [0]不删除该节点 [1]删除该节点
    //状态转移方程: ---
    //想办法看能不能简化成选了"打家结社模型" 选了这个位置就不能选相邻的位置
    //转换映射
    int deleteAndEarn(vector<int>& nums) {
        const int N=2*1e4;
        int arr[N];
        bzero(arr,N*sizeof(int));
        int m=0;
        for(auto e:nums){
            m=max(e,m);
            arr[e]++;
        }
        vector<vector<int>>dp(m+1,vector(2,0));
        for(int i=1;i<=m;i++){
            dp[i][0]=max(dp[i-1][0],dp[i-1][1]);
            dp[i][1]=dp[i-1][0]+arr[i]*i;
        }
        return max(dp[m][0],dp[m][1]);
    }
};